iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 21
0
Elastic Stack on Cloud

Elastic 30天自我修行系列 第 21

下載三國演義120回,等待明天上傳Elastic Cloud

  • 分享至 

  • xImage
  •  

忙到翻天的星期一,現在今天靠著下載120回的三國演義 來混過一天了

我選擇的網站是 "中國哲學書電子化計劃"
三國演義第1回是
https://ctext.org/sanguo-yanyi/ch1/zh?en=off
三國演義第120回是
https://ctext.org/sanguo-yanyi/ch120/zh?en=off
可以觀察到,差別只在從 ch1 變成了 ch120,所以等一下寫個迴圈就可以快速地處理

因為這次的重點還是在於後續上傳到 Elastic Cloud 的應用,所以爬蟲程式就寫得粗暴又簡單。

其中,套件 httr 是負責捉取網頁,而 rvest 是負責解析網頁。magrittr 則是 pipeline 操作的套件。
若你經常需要進行資料探索,pipeline 的語言給予我們很多的彈性,而且又容易理解;

# %>%  : pipeline 操作
# 舉例來說,以下2者是等價的

sum(head(1:100))
1:100 %>% head %>% sum

同理在做網頁解析時,除了 Chrome 開發者工具提供很多選取的確認,pipeline 的操作也能加速我們的開發。

不過,如果你的爬蟲是需要定例執行,可減少 pipeline 的使用,因為多多少少會減損效能;不過對於只有120回的三國演義來說,那一種寫法都是沒有太大的差異囉。

捉取120回三國演義的 R 語法如下。

require(httr)
library(rvest)
require(magrittr)

save_path <- "d:/02_My_Code/01_R/sanguoyanyi_text"

for (page in 1:120) {
  res <- httr::GET(url = paste0("https://ctext.org/sanguo-yanyi/ch", page, "/zh?en=off"), httr::add_headers(.headers = headers))

  my_sanguo_text <- content(res, "text") %>%
    read_html() %>%
    html_nodes("td[class=ctext]") %>%
    html_text() %>%
    gsub("\n", "", .) %>%
    paste0(., collapse = "")

  readr::write_file(my_sanguo_text, file.path(save_path, paste0(page, ".txt")))

  Sys.sleep(1)
}

其中比較需要注意的是,原本我們捉取資料時,會有許多斷行符號(\n),這個會造成我們後續上傳 Elastic Cloud時的困擾;所以我希望讓事情簡單化,讓單一回的三國演義,只有一個斷行符號。捉下來後,在 Visual Studio Code 中開啟時,左邊的行數提示就只會出現 1 ,如下圖:

https://ithelp.ithome.com.tw/upload/images/20200921/20130033YxFEd02WTp.png

存檔時也直接命名為 1.txt、2.txt、3.txt... 120.txt,沒多做太多的處理。
希望明天可以順利將120回上傳成功啊 ....


上一篇
在 Elastic Cloud 安裝中文分詞外掛
下一篇
上傳三國演義120回到Elastic Cloud
系列文
Elastic 30天自我修行31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言